﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using APILocawebGateway.AMEX.Respostas;
using APILocawebGateway.AMEX.QueryString;
using System.Collections.Specialized;

namespace APILocawebGateway.AMEX
{
    public sealed class GerenciadorRequisicaoAMEX
    {
        private ConfiguracaoAMEX _configuracaoAMEX;

        /// <summary>
        /// Este método obtem o resultado do envio e retorna um objeto do tipo RespostaAmex
        /// </summary>
        /// <param name="fonte"></param>
        /// <returns></returns>
        private RespostaAMEX ObterResultadoEnvio(String fonte)
        {
            RespostaAMEX respostaAMEX = new RespostaAMEX();

            respostaAMEX.Montante = Utilidades.ObterValorCampoRetorno(fonte, "Amount");
            respostaAMEX.Idioma = Utilidades.ObterValorCampoRetorno(fonte, "locale");
            respostaAMEX.NumeroBatch = Utilidades.ObterValorCampoRetorno(fonte, "BatchNo");
            respostaAMEX.Cartao = Utilidades.ObterValorCampoRetorno(fonte, "Card");
            respostaAMEX.CampoLivre = Utilidades.ObterValorCampoRetorno(fonte, "OrderInfo");
            respostaAMEX.NumeroRecibo = Utilidades.ObterValorCampoRetorno(fonte, "ReceiptNo");
            respostaAMEX.IdEstabelecimento = Utilidades.ObterValorCampoRetorno(fonte, "Merchant");
            respostaAMEX.NumeroAutorizacao = Utilidades.ObterValorCampoRetorno(fonte, "AuthorizeId");
            respostaAMEX.NumeroOrdem = Utilidades.ObterValorCampoRetorno(fonte, "MerchTxnRef");
            respostaAMEX.NumeroTransacao = Utilidades.ObterValorCampoRetorno(fonte, "TransactionNo");
            respostaAMEX.CodigoRetornoTransacao = Utilidades.ObterValorCampoRetorno(fonte, "TxnResponseCode");
            respostaAMEX.MensagemErroTransacao = Utilidades.ObterValorCampoRetorno(fonte, "Message");

            return respostaAMEX;

        }

        /// <summary>
        /// Este método renderiza a resposta do envio
        /// </summary>
        /// <param name="contexto"></param>
        public static void RenderizarRespostaEnvio(HttpContext contexto)
        {
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("TxnResponseCode", contexto.Request[RespostaQueryStringAMEX.CODIGORETORNOTRANSACAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("OrderInfo", contexto.Request[RespostaQueryStringAMEX.CAMPOLIVRE]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("Card", contexto.Request[RespostaQueryStringAMEX.CARTAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("Merchant", contexto.Request[RespostaQueryStringAMEX.IDESTABELECIMENTO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("Locale", contexto.Request[RespostaQueryStringAMEX.IDIOMA]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("Message", contexto.Request[RespostaQueryStringAMEX.MENSAGEMERROTRANSACAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("Amount", contexto.Request[RespostaQueryStringAMEX.MONTANTE]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("AuthorizeId", contexto.Request[RespostaQueryStringAMEX.NUMEROAUTORIZACAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("BatchNo", contexto.Request[RespostaQueryStringAMEX.NUMEROBATCH]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("MerchTxnRef", contexto.Request[RespostaQueryStringAMEX.NUMEROORDEM]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("TransactionNo", contexto.Request[RespostaQueryStringAMEX.NUMEROTRANSACAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("TxnResponseCode", contexto.Request[RespostaQueryStringAMEX.CODIGORETORNOTRANSACAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno("Message", contexto.Request[RespostaQueryStringAMEX.MENSAGEMERROTRANSACAO]));

        }

        /// <summary>
        /// Este método realiza a requisição de captura da transação.
        /// </summary>
        /// <param name="respostaAmex"></param>
        [Obsolete("O método não está funcionando corretamente com o ambiente da locaweb")]
        private RespostaCapturaAMEX RealizarRequisicaoCaptura(RespostaAMEX respostaAmex)
        {
            NameValueCollection queryString = new NameValueCollection();
            queryString.Add("identificacao", _configuracaoAMEX.Identificacao);
            queryString.Add("ambiente", _configuracaoAMEX.Ambiente.ToString());
            queryString.Add("modulo", Modulos.AMEX);
            queryString.Add("operacao", "Captura");
            queryString.Add("MerchTxnRef", respostaAmex.NumeroOrdem);
            queryString.Add("TransactionNo", respostaAmex.NumeroTransacao);
            queryString.Add("CaptureAmount", respostaAmex.Montante);
            return ObterResultadoCaptura(Utilidades.RealizarRequisicaoModoPost(queryString));
        }

        /// <summary>
        /// Este método renderiza os dados do retorno da captura 
        /// </summary>
        /// <param name="contexto"></param>
        public static void RenderizarDadosCaptura(HttpContext contexto)
        {
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.MONTANTE, contexto.Request[RetornoCapturaQueryStringAMEX.MONTANTE]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.NUMEROORDEM, contexto.Request[RetornoCapturaQueryStringAMEX.NUMEROORDEM]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.NUMEROBATCH, contexto.Request[RetornoCapturaQueryStringAMEX.NUMEROBATCH]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.CARTAO, contexto.Request[RetornoCapturaQueryStringAMEX.CARTAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.NUMERORECIBO, contexto.Request[RetornoCapturaQueryStringAMEX.NUMERORECIBO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.IDESTABELECIMENTO, contexto.Request[RetornoCapturaQueryStringAMEX.IDESTABELECIMENTO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.NUMEROAUTORIZACAO, contexto.Request[RetornoCapturaQueryStringAMEX.NUMEROAUTORIZACAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.CODIGORETORNOTRANSACAO, contexto.Request[RetornoCapturaQueryStringAMEX.CODIGORETORNOTRANSACAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.MENSAGEMERROTRANSACAO, contexto.Request[RetornoCapturaQueryStringAMEX.MENSAGEMERROTRANSACAO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.VALORCAPTURADO, contexto.Request[RetornoCapturaQueryStringAMEX.VALORCAPTURADO]));
            contexto.Response.Write(Utilidades.RenderizarCampoRetorno(RetornoCapturaQueryStringAMEX.VALORPENDENTECAPTURA, contexto.Request[RetornoCapturaQueryStringAMEX.VALORPENDENTECAPTURA]));



        }

        /// <summary>
        /// Este método retorna o resultado da captura do processo AMEX
        /// </summary>
        /// <param name="fonte"></param>
        /// <returns></returns>
        [Obsolete("O método não está funcionando corretamente com o ambiente da locaweb")]
        private RespostaCapturaAMEX ObterResultadoCaptura(String fonte)
        {
            RespostaCapturaAMEX respostaCapturaAmex = new RespostaCapturaAMEX();
            respostaCapturaAmex.Cartao = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.CARTAO);
            respostaCapturaAmex.CodigoRetornoTransacao = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.CODIGORETORNOTRANSACAO);
            respostaCapturaAmex.IdEstabelecimento = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.IDESTABELECIMENTO);
            respostaCapturaAmex.MensagemErroTransacao = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.MENSAGEMERROTRANSACAO);
            respostaCapturaAmex.Montante = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.MONTANTE);
            respostaCapturaAmex.NumeroAutorizacao = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.NUMEROAUTORIZACAO);
            respostaCapturaAmex.NumeroBatch = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.NUMEROBATCH);
            respostaCapturaAmex.NumeroOrdem = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.NUMEROORDEM);
            respostaCapturaAmex.NumeroRecibo = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.NUMERORECIBO);
            respostaCapturaAmex.NumeroTransacao = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.NUMEROTRANSACAO);
            respostaCapturaAmex.Valorcapturado = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.VALORCAPTURADO);
            respostaCapturaAmex.ValorPendenteCaptura = Utilidades.ObterValorCampoRetorno(fonte, RetornoCapturaQueryStringAMEX.VALORPENDENTECAPTURA);

            return respostaCapturaAmex;

        }


        /// <summary>
        /// Construtor do gerenciador de requisição AMEX
        /// </summary>
        /// <param name="configuracaoAMEX"></param>
        public GerenciadorRequisicaoAMEX(ConfiguracaoAMEX configuracaoAMEX)
        {
            _configuracaoAMEX = configuracaoAMEX;
        }

    }
}
